package com.tool.genxml.handler;

import cn.hutool.core.collection.CollUtil;
import com.tool.genxml.entity.MergedRegion;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFSheet;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author: zhoubin
 * @date: 2024/3/26
 */
public abstract class MergedRegionsHandler implements BaseHandler {

    /**
     * 保存合并过的单元格
     * 最外层的key为行号，内层的key为列号
     */
    Map<Integer, Map<Integer, MergedRegion>> regionMap = new HashMap<>();

    /**
     * 遍历sheet页中的所有合并单元格
     * @param sheet 目标sheet页
     */
    protected void iterateMergedRegion(XSSFSheet sheet) {
        // 获取到所有合并单元格
        List<CellRangeAddress> mergedRegions = sheet.getMergedRegions();

        // 遍历合并的单元格，并将其存入到map中
        for (CellRangeAddress address : mergedRegions) {
            MergedRegion region = MergedRegion.convertMergedRegion(address);
            String val = sheet.getRow(region.getStartRow()).getCell(region.getStartColumn()).toString();
            region.setVal(val);
            setRegion(region);
        }
    }

    /**
     * 向map中放入合并后的单元格
     * @param region
     */
    protected void setRegion(MergedRegion region) {
        int startRow = region.getStartRow();
        // 通过行号获取内层的map
        Map<Integer, MergedRegion> rowRegionMap = regionMap.get(startRow);

        // 如果内层的map为空，则新建一个内层的map
        if (CollUtil.isEmpty(rowRegionMap)) {
            rowRegionMap = new HashMap<>();
            regionMap.put(startRow, rowRegionMap);
        }

        // 将合并后的单元格保存入内层的map中
        int startIndex = region.getStartColumn();
        rowRegionMap.put(startIndex, region);
    }

    /**
     * 获取改行第一个合并的单元格
     * @param row
     * @return
     */
    protected MergedRegion getFirstRegion(int row) {
        return getRegion(row, 0);
    }

    /**
     * 获取当前行所有的合并单元格
     * @param row 行号
     * @return
     */
    protected Map<Integer, MergedRegion> getRowRegion(int row) {
        return regionMap.get(row);
    }

    /**
     * 根据行号和列号获取合并单元格
     * @param row 行号
     * @param column 列号
     * @return
     */
    protected MergedRegion getRegion(int row, int column) {

        Map<Integer, MergedRegion> rowRegionMap = regionMap.get(row);
        // 当改行没有合并的单元格时，直接返回空
        if (CollUtil.isEmpty(rowRegionMap)) {
            return null;
        }

        MergedRegion region = rowRegionMap.get(column);
        return region;
    }



}
